package oj.oj_155;

import java.util.Deque;
import java.util.LinkedList;

class MinStack正确2 {
    private final Deque<Integer> 普通栈 = new LinkedList<>();
    private final Deque<Integer> 记录最小值的栈 = new LinkedList<>();

    public MinStack正确2() {

    }

    public void push(int val) {
        普通栈.push(val);
        // 检查下新的元素是否小于 之前的最小值
        // 之前的最小值就是 记录最小值的栈 的栈顶元素
        // 要取栈顶元素，需要保证，栈不是 empty
        if (记录最小值的栈.isEmpty()) {
            记录最小值的栈.push(val);
        } else if (val <= 记录最小值的栈.peek()) {
            记录最小值的栈.push(val);
        }
    }

    public void pop() {
        if (普通栈.isEmpty()) {
            return;
        }

        // 这里不需要检查 记录最小值的栈.isEmpty()，因为逻辑上，普通栈不是 empty，则 记录最小值的栈 一定不是 empty
        // 断言：val >= 记录最小值的栈.peek()
        int val = 普通栈.peek();
        if (val == 记录最小值的栈.peek()) {
            记录最小值的栈.pop();
        }

        普通栈.pop();
    }

    public int top() {
        if (普通栈.isEmpty()) {
            return -1;
        }

        return 普通栈.peek();
    }

    public int getMin() {
        if (普通栈.isEmpty()) {
            return -1;
        }

        return 记录最小值的栈.peek();
    }

    public static void main(String[] args) {
        MinStack2 stack = new MinStack2();

        stack.push(5);
        stack.push(3);
        stack.push(7);
        stack.push(1);
        stack.push(1);
        stack.push(0);
        stack.pop();
        stack.pop();
        stack.pop();
        stack.pop();
        stack.pop();
        stack.pop();

    }
}
